#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

// 全局变量
int position_x,position_y; // 小球位置
int high,width; //  游戏画面尺寸
int score; // 得分
int v_x,v_y;//速度 
int dangban_y;//挡板位置 
int speed;//小球速度


void gotoxy(int x,int y)  //光标移动到(x,y)位置
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}

void HideCursor() // 用于隐藏光标
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0};  // 第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void startup() // 数据初始化
{
	high = 20;
	width = 30;
	position_x = high/2;
	position_y = width/2;	
	score = 0;
	v_x=1,v_y=1; 
	dangban_y=width/2;
	speed=9;

	HideCursor(); // 隐藏光标
}

void show()  // 显示画面
{
	gotoxy(0,0);  // 光标移动到原点位置，以下重画清屏
	int i,j;
	for (i=0;i<=high;i++)
	{
		for (j=0;j<=width;j++)
		{
			if ((i==position_x) && (j==position_y))
				printf("0");  //输出小球0 
			else if(j==width)
				printf("|");//输出右边界
			else if(i==high&&j>=dangban_y-3&&j<=dangban_y+3)
				printf("w");//输出挡板	
			else
				printf(" "); 
		}
		printf("\n");
	}
	printf("得分：%d\n",score);//输出得分 
}	

void updateWithoutInput() // 与用户输入无关的更新
{	
  //循环几次执行一次语句，（注意在这段时间里可能有的漏洞） 
	static int stop=0;//控制小球运动的延时并赋初值 
	if(stop<speed)//延时
	stop++;
	if(stop==speed)
	{
	 position_x+=v_x;//小球运动 
	 position_y+=v_y;
	 stop=0;//重置延时 
	
	 
	if(position_x==0)  //上边界反弹 
	v_x=-v_x;
	if(position_y==0||position_y==width)  //左右反弹 
	v_y=-v_y;
	
	
	//小球到下边界时 
	if(position_x==high-1){
		if(position_y>=dangban_y-3&&position_y<=dangban_y+3)//挡板接住球 
		{
			v_x=-v_x; //改变方向 
			score++;  //加分 
			if(speed>4){   //限制最低延时（最大速度）
				speed--;//降低延时（小球加速） 
				stop=0;
			}
			
		}
		else {  //挡板没接住球 
		  printf("Game Over!");
		}
			
	}
	
	}
	
	

}

void updateWithInput()  // 与用户输入有关的更新
{
	char move;//移动挡板
	if(kbhit()){
		move=getch();
		if(move=='z')
		dangban_y--;
		if(move=='x')
		dangban_y++;
	} 
	
	
}

int main()
{
	startup();  // 数据初始化	
	while (1) //  游戏循环执行
	{
		show();  // 显示画面
		updateWithoutInput();  // 与用户输入无关的更新
		updateWithInput();  // 与用户输入有关的更新
	}
	return 0;
}